package com.odontosis.view.paciente.recibo;

import java.awt.Color;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.logging.Logger;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import com.lowagie.text.BadElementException;
import com.lowagie.text.Cell;
import com.lowagie.text.Font;
import com.lowagie.text.Paragraph;
import com.lowagie.text.Phrase;
import com.lowagie.text.Table;
import com.odontosis.acesso.filtro.PermissaoAcesso;
import com.odontosis.entidade.FormaPagamento;
import com.odontosis.entidade.Pagamento;
import com.odontosis.entidade.Recibo;
import com.odontosis.entidade.TipoRecibo;
import com.odontosis.entidade.Usuario;
import com.odontosis.ioc.ContainerIoc;
import com.odontosis.rel.DocumentoBasico;
import com.odontosis.service.PagamentoService;
import com.odontosis.service.ParametrosService;
import com.odontosis.service.ReciboService;
import com.odontosis.util.Constantes;
import com.odontosis.util.ImpressaoPortaParalela;
import com.odontosis.util.StringUtilsOdontosis;
import com.odontosis.view.OdontosisAction;

public class AcaoRecibo extends  OdontosisAction<PagamentoService> {
	
	protected Log log = LogFactory.getLog(this.getClass());
	
	@Override
	public ActionForward execute(ActionMapping arg0, ActionForm form,
			HttpServletRequest arg2, HttpServletResponse arg3) throws Exception {
		FormRecibo formulario = (FormRecibo) form;
		if(StringUtils.isEmpty(formulario.getMetodo()))
		{
			return onIniciar(arg0, form, arg2, arg3);
		}
		return onExecutar(arg0, form, arg2, arg3);
	}
	
	public ActionForward onExecutar(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		FormRecibo formulario = (FormRecibo) form;
		ReciboService reciboService = ContainerIoc.getReciboService();
		
		
		if(formulario.getValorPago() != null){
			Long a = Long.parseLong(formulario.getPagamentoId());
			Pagamento pagamento = service.load(a);
			Double valor = Double.parseDouble(formulario.getValorPago());
			TipoRecibo tipo = TipoRecibo.recuperarPorCodigo(Integer.parseInt(formulario.getTipoRecibo()));
			FormaPagamento forma = FormaPagamento.recuperarPorCodigo(Integer.parseInt(formulario.getFormaPagamento()));
			ContainerIoc.getPacienteService().gerarNumeroPasta(pagamento.getServico().getPacienteServico());
			
			String numeroCheque = formulario.getNumeroCheque();
			String banco = formulario.getBanco();
			String nomeEmitente = formulario.getNomeEmitente();
			Usuario usuario = (Usuario) request.getSession().getAttribute("usuario");
			
			//gravar Recibo
			Recibo recibo = reciboService.gravarPagamentoEfetuado(pagamento,valor, tipo, forma, numeroCheque, banco, nomeEmitente, usuario);
			reciboService.refresh(recibo);
			
			formulario.setValorPago(null);
			try {
				imprimirRecibo(request, recibo);
			}catch (Exception e) {
				log.warn("ERRO ao imprimir recibo");
			}
			request.getSession().setAttribute("pacientePagamento", recibo.getPagamento().getServico().getPacienteServico());
		}
		
		if(ContainerIoc.getParametrosService().buscarTipoImpressao().intValue() == 5) {
			request.getSession().setAttribute("reimpressao", false);
			return mapping.findForward("impressao");
		}
		
		Collection<String> sucesso = new ArrayList<String>();
		sucesso.add("Recibo Gerado com sucesso.");
		request.setAttribute("sucesso", sucesso);
		
		return mapping.findForward("pagamento");
	}

	
	
	public ActionForward onIniciar(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		FormRecibo formulario = (FormRecibo) form;
		Long a = Long.parseLong(formulario.getPagamentoId());
		//ContainerIoc.getPagamentoService().g
		PagamentoService pagamentoService = ContainerIoc.getPagamentoService();
		Pagamento pagamento = pagamentoService.load(a);
		pagamentoService.getSession().refresh(pagamento);
		if(!pagamento.isAtivo() || pagamento.isPago()){
			Collection<String> sucesso = new ArrayList<String>();
			sucesso.add("Parcela já paga, ou isenta. Escolha outra parcela");
			request.setAttribute("mensagens", sucesso);
			request.setAttribute("sucesso", null);
			return mapping.findForward("pagamento");
		}
		
		if(StringUtilsOdontosis.isVazia(formulario.getForcarPagamento()) || !formulario.getForcarPagamento().equals("1")) {
			if(!pagamentoService.isUltimaParcelaVencida(pagamento)) {
				Collection<String> alerta = new ArrayList<String>();
				alerta.add("Existe(m) parcela(s) não paga(s) anterior(es) a parcela escolhida.");
				alerta.add("Para continuar e pagar esta parcela <a title=\"Informar Pagamento\" href=\"/odontosis/recibo.do?pagamentoId="+pagamento.getId()+"&forcarPagamento=1\">Click Aqui</a> ou escolha uma parcela não paga anterior a escolhida.");
				request.setAttribute("alerta", alerta);
				
				request.getSession().setAttribute("pacientePagamento", pagamento.getServico().getPacienteServico());
				return mapping.findForward("pagamento");
			}
		}
		
		//*****Inicializa valores***************//
		
		
		formulario.setPagamento(pagamento);
		formulario.setDataVencimento(pagamento.getMesVencimento() + "/" + pagamento.getAnoVencimento());
		formulario.setNomePaciente(pagamento.getServico().getPacienteServico().getNome());
		formulario.setValorPagamento(pagamento.getValor().toString());
		
		return mapping.getInputForward(); 
	}
	
	public static Table criarObjetoTabela(boolean usarFontes, float[] headerWidths, int colunas) {
        try {
            Table aTable = new Table(colunas);
            Font fonteCabecalho = new Font(Font.HELVETICA, 13, Font.BOLD);

            aTable.setPadding(1);
            aTable.setSpacing(0);

            aTable.setWidths(headerWidths);

            aTable.widthPercentage();
            aTable.setWidth(100);
            aTable.setBorder(0);

            aTable.setSpaceBetweenCells(0);
           
            aTable.setDefaultCellBorderWidth(0);
            aTable.setBorder(0);
            aTable.setMarkupAttribute("class", "adur-table");

            return aTable;
        } catch (BadElementException e) {
            throw new RuntimeException("Erro definindo largura do cabeçalho", e);
        }
    }
	
	public static void imprimirRecibo(HttpServletRequest request, Recibo recibo) throws Exception {
		ImpressaoPortaParalela impressaoPortaParalela = new ImpressaoPortaParalela();
		ParametrosService parametrosService = ContainerIoc.getParametrosService();
		String emitente = parametrosService.buscarDentista();
		String endereco = parametrosService.buscarEndereco();
		String cpf = parametrosService.buscarCpf();
		String cnpj = parametrosService.buscarCnpj();
		String usuario = ((Usuario) PermissaoAcesso.getUsuarioLogado(request)).getNome();
		String enderecoImpressora = parametrosService.buscarEnderecoImpressora();
		
		impressaoPortaParalela.setEnderecoImpressora(enderecoImpressora);
		switch (recibo.getTipoRecibo()) {
		case PFSEMCPF:
			impressaoPortaParalela.montarReciboSemCPF(usuario, emitente, endereco, recibo);
			break;
		case PFCOMCPF:
			impressaoPortaParalela.montarReciboComCPF(cpf, usuario, emitente, endereco, recibo);
			break;
		case PJ:	
			impressaoPortaParalela.montarReciboComCNPJ(cnpj, usuario, emitente, endereco, recibo);
			break;

		default:
			break;
		}
		
		if(ContainerIoc.getParametrosService().buscarTipoImpressao().intValue() == 5 ) {
			request.getSession().setAttribute("textoImpressao", impressaoPortaParalela.getTexto());
		} else {
			impressaoPortaParalela.imprimir();
		}
	}
	
	
	public static void imprimirRecibo_old(HttpServletResponse response, Recibo recibo ) throws Exception{
		DocumentoBasico reciboImpresso = new DocumentoBasico(Constantes.PDF,response);
	      Font fontItem = new Font(Font.HELVETICA, 8, Font.NORMAL);
	      Font fontTotal = new Font(Font.HELVETICA, 8, Font.BOLD);
	      Font fonteTitulo = new Font(Font.HELVETICA, 10, Font.BOLD);
	      Font fonteTitulo1 = new Font(Font.HELVETICA, 10, Font.BOLD);
	      Font fonteCabecalho = new Font(Font.HELVETICA, 13, Font.BOLD);
	        
	    float[] tamanhos =  {3f,3f};
	    Table table = criarObjetoTabela(true,tamanhos,2);
		Cell cell1 = new Cell(new Phrase("Recibo\n"+recibo.getVersao()+"ª via", fonteCabecalho));
		cell1.setHorizontalAlignment(Cell.ALIGN_CENTER);
		cell1.setColspan(2);
		cell1.setBackgroundColor(new Color(236, 235, 234));
		table.addCell(cell1);
		table.addCell(new Cell(new Phrase("Número: "+ StringUtilsOdontosis.colocaZeros(recibo.getId().toString(), 10),fontTotal)));
	    table.addCell(new Cell(new Phrase("R$: " + StringUtilsOdontosis.formatarDouble(recibo.getValor().doubleValue()),fontTotal)));
	    String descricao = "Recebi de: " + recibo.getPagamento().getServico().getPacienteServico().getNome()+
	    "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tCpf/Cnpj: " + "____________________________________\n" +
	    "A importância supra de: __________________________________________________________________________________________"+
	    				 "\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t___________________________________________________________________________________________"+
	    "\nReferente a meus serviços profissionais.";
	    if(recibo.getReciboAnulado() != null){
			descricao += "\nObs.: Este recibo anula o recibo de número: " + StringUtilsOdontosis.colocaZeros(recibo.getReciboAnulado().getId().toString(),10);
		}
	    if(recibo.getFormaPagamento() == FormaPagamento.CHEQUE){
	    	descricao += "\nPagamento efetuado com o cheque de número: " + recibo.getNumeroCheque();
	    }
	    
		Cell cellPaciente = new Cell(new Phrase(descricao,fontItem));
	    
	    cellPaciente.setColspan(2);
		table.addCell(cellPaciente);
		SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yyyy");
		String data = formato.format(new Date()); 
	    ReciboService reciboService = ContainerIoc.getReciboService();
		Cell rodape1 = new Cell(new Phrase(reciboService.buscarCidade() + "," +data,fontTotal));
		rodape1.setHorizontalAlignment(Cell.ALIGN_CENTER);
	    rodape1.setColspan(2);
		table.addCell(rodape1);
		String info = "________________________\n" + reciboService.buscarDentista();
		if(recibo.getTipoRecibo() == TipoRecibo.PFCOMCPF){
			info +=   "\nCPF: " + reciboService.buscarCpf();  
		}else if(recibo.getTipoRecibo() == TipoRecibo.PFSEMCPF){
			//não imprime nada
		}else if(recibo.getTipoRecibo() == TipoRecibo.PJ){
			info +=   "\nCNPJ: " + reciboService.buscarCnpj();
		}
		info +=   "\nCRO: " + reciboService.buscarCRO();
		
		Cell dados = new Cell(new Phrase(info,fonteTitulo));
		dados.setHorizontalAlignment(Cell.ALIGN_CENTER);
		table.addCell(dados);
		Cell rodape2 = new Cell(new Phrase(reciboService.buscarEndereco(),fontTotal));
		rodape2.setVerticalAlignment(Cell.ALIGN_MIDDLE);
		rodape2.setHorizontalAlignment(Cell.ALIGN_CENTER);
		table.addCell(rodape2);
	    reciboImpresso.adicionarElemento(table);
	    reciboImpresso.adicionarElemento(new Paragraph("\n"));
	    reciboImpresso.adicionarElemento(table);   
		

		reciboImpresso.fecharDocumento();
	}
}
